#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
腾讯云HAI安全配置辅助工具
帮助用户快速设置安全的腾讯云访问配置
"""

import os
import sys
import getpass
import json
import subprocess
from pathlib import Path
from typing import Dict, List, Optional

class SecuritySetupHelper:
    """安全配置助手"""
    
    def __init__(self):
        self.project_root = Path(__file__).parent
        self.env_file = self.project_root / ".env"
        self.env_example = self.project_root / "env.example"
        
    def print_banner(self):
        """打印欢迎横幅"""
        print("=" * 60)
        print("🔐 腾讯云HAI安全配置助手")
        print("=" * 60)
        print("根据腾讯云安全最佳实践，此工具将帮助您：")
        print("✅ 创建安全的子账号配置")
        print("✅ 设置环境变量")
        print("✅ 验证API连接")
        print("✅ 配置安全策略")
        print("=" * 60)
        
    def check_prerequisites(self) -> bool:
        """检查前置条件"""
        print("\n📋 检查前置条件...")
        
        # 检查Python版本
        if sys.version_info < (3, 7):
            print("❌ Python版本过低，需要Python 3.7+")
            return False
            
        # 检查必要的包
        required_packages = ['tencentcloud-sdk-python']
        missing_packages = []
        
        for package in required_packages:
            try:
                __import__(package.replace('-', '_'))
            except ImportError:
                missing_packages.append(package)
        
        if missing_packages:
            print(f"❌ 缺少必要的包: {', '.join(missing_packages)}")
            print("请运行: pip install tencentcloud-sdk-python")
            return False
            
        print("✅ 前置条件检查通过")
        return True
        
    def create_subaccount_guide(self):
        """显示创建子账号的指导"""
        print("\n👤 创建子账号指导")
        print("-" * 40)
        print("请按照以下步骤创建子账号：")
        print()
        print("1️⃣ 登录腾讯云控制台:")
        print("   https://console.cloud.tencent.com/")
        print()
        print("2️⃣ 进入访问管理CAM:")
        print("   https://console.cloud.tencent.com/cam")
        print()
        print("3️⃣ 创建子用户:")
        print("   - 点击 '用户' → '用户列表'")
        print("   - 点击 '新建用户'")
        print("   - 选择 '自定义创建'")
        print("   - 用户名: hai-optimization-user")
        print("   - 勾选 '编程访问' (用于API调用)")
        print("   - 不勾选 '腾讯云控制台访问'")
        print()
        print("4️⃣ 设置权限:")
        print("   - 选择 '从策略列表中选择'")
        print("   - 添加策略: QcloudMonitorReadOnlyAccess")
        print("   - 添加策略: QcloudCLSReadOnlyAccess")
        print("   - ⚠️  重要: HAI服务没有预设策略，需要创建自定义策略")
        print("   - 详见: HAI_PERMISSIONS_GUIDE.md")
        print()
        print("   自定义策略创建步骤:")
        print("   1. CAM控制台 → 策略 → 新建策略 → 按策略语法创建")
        print("   2. 策略名称: HAI-Optimization-Access")
        print("   3. 复制 hai_policy_template.json 文件内容")
        print("   4. 保存策略并绑定到子用户")
        print()
        print("5️⃣ 创建访问密钥:")
        print("   - 在用户详情页点击 'API密钥'")
        print("   - 点击 '新建密钥'")
        print("   - 下载并保存密钥文件")
        
    def get_credentials(self) -> Dict[str, str]:
        """获取用户凭据"""
        print("\n🔑 输入腾讯云凭据")
        print("-" * 40)
        print("请输入子账号的访问密钥信息：")
        print()
        
        secret_id = getpass.getpass("Secret ID: ").strip()
        secret_key = getpass.getpass("Secret Key: ").strip()
        
        # 选择默认地域
        print("\n选择默认地域:")
        regions = [
            ("ap-beijing", "北京"),
            ("ap-nanjing", "南京"),
            ("ap-guangzhou", "广州"),
            ("ap-shanghai", "上海"),
            ("ap-chongqing", "重庆")
        ]
        
        for i, (region, name) in enumerate(regions, 1):
            print(f"  {i}. {name} ({region})")
            
        while True:
            try:
                choice = int(input("请选择地域 (1-5): ")) - 1
                if 0 <= choice < len(regions):
                    region = regions[choice][0]
                    break
                else:
                    print("无效选择，请重新输入")
            except ValueError:
                print("请输入有效数字")
                
        return {
            "TENCENT_SECRET_ID": secret_id,
            "TENCENT_SECRET_KEY": secret_key,
            "TENCENT_REGION": region
        }
        
    def create_env_file(self, credentials: Dict[str, str]):
        """创建环境配置文件"""
        print("\n📝 创建环境配置文件...")
        
        # 读取示例配置文件
        if self.env_example.exists():
            with open(self.env_example, 'r', encoding='utf-8') as f:
                content = f.read()
        else:
            content = """# 腾讯云HAI优化系统环境变量配置
# 自动生成的配置文件

# 腾讯云配置 - 使用子账号密钥
TENCENT_SECRET_ID=your_tencent_secret_id_here
TENCENT_SECRET_KEY=your_tencent_secret_key_here
TENCENT_REGION=ap-beijing

# 支持的HAI地域列表
# ap-beijing, ap-nanjing, ap-guangzhou, ap-shanghai, ap-chongqing
# 注意：ap-chengdu (成都) 不支持HAI服务

# 系统配置
DEBUG=false
LOG_LEVEL=INFO

# API服务器配置
API_HOST=0.0.0.0
API_PORT=8080

# 监控配置
ENABLE_METRICS=true
ENABLE_ALERTS=true
ENABLE_AUTO_SCALING=true

# 安全配置
ENABLE_RATE_LIMITING=true
RATE_LIMIT_PER_MINUTE=60

# 性能配置
MAX_CONCURRENT_REQUESTS=100
REQUEST_TIMEOUT=30
"""
        
        # 替换配置值
        for key, value in credentials.items():
            content = content.replace(f"{key}=your_tencent_{key.lower()}_here", f"{key}={value}")
            content = content.replace(f"{key}=ap-beijing", f"{key}={value}")
            
        # 写入配置文件
        with open(self.env_file, 'w', encoding='utf-8') as f:
            f.write(content)
            
        # 设置文件权限（仅所有者可读写）
        os.chmod(self.env_file, 0o600)
        
        print(f"✅ 配置文件已创建: {self.env_file}")
        print("🔒 已设置文件权限为仅所有者可读写")
        
    def test_api_connection(self, credentials: Dict[str, str]) -> bool:
        """测试API连接"""
        print("\n🧪 测试API连接...")
        
        try:
            # 设置环境变量
            os.environ.update(credentials)
            
            # 导入并测试HAI客户端
            sys.path.insert(0, str(self.project_root))
            from core.tencent_hai_api import TencentHAIClient
            
            client = TencentHAIClient(
                credentials["TENCENT_SECRET_ID"],
                credentials["TENCENT_SECRET_KEY"],
                credentials["TENCENT_REGION"]
            )
            
            if client.enabled:
                print("✅ API连接成功")
                print(f"   地域: {credentials['TENCENT_REGION']}")
                print(f"   真实应用: {len(client.real_apps)} 个")
                return True
            else:
                print("❌ API连接失败")
                print("   可能原因:")
                print("   - 访问密钥无效")
                print("   - 子账号权限不足")
                print("   - 网络连接问题")
                return False
                
        except Exception as e:
            print(f"❌ API连接测试失败: {e}")
            return False
            
    def run_system_tests(self) -> bool:
        """运行系统测试"""
        print("\n🧪 运行系统测试...")
        
        try:
            # 运行基础测试
            result = subprocess.run([
                sys.executable, "test_system.py"
            ], capture_output=True, text=True, cwd=self.project_root)
            
            if result.returncode == 0:
                print("✅ 基础功能测试通过")
            else:
                print("❌ 基础功能测试失败")
                print(result.stderr)
                return False
                
            # 运行真实应用测试
            result = subprocess.run([
                sys.executable, "test_real_apps.py"
            ], capture_output=True, text=True, cwd=self.project_root)
            
            if result.returncode == 0:
                print("✅ 真实应用测试通过")
                return True
            else:
                print("❌ 真实应用测试失败")
                print(result.stderr)
                return False
                
        except Exception as e:
            print(f"❌ 测试运行失败: {e}")
            return False
            
    def show_security_recommendations(self):
        """显示安全建议"""
        print("\n🛡️ 安全建议")
        print("-" * 40)
        print("为确保系统安全，建议您：")
        print()
        print("1. 开启MFA保护:")
        print("   - 在CAM控制台为子用户开启MFA")
        print("   - 绑定手机APP或硬件令牌")
        print()
        print("2. 设置IP访问限制:")
        print("   - 限制子用户只能从特定IP访问")
        print("   - 添加您的服务器和办公网络IP")
        print()
        print("3. 定期轮换密钥:")
        print("   - 建议每90天轮换一次访问密钥")
        print("   - 创建新密钥后先测试再删除旧密钥")
        print()
        print("4. 监控API使用:")
        print("   - 启用操作审计记录API调用")
        print("   - 设置异常访问告警")
        print()
        print("5. 最小权限原则:")
        print("   - 只授予必要的权限")
        print("   - 定期审查用户权限")
        
    def show_next_steps(self):
        """显示后续步骤"""
        print("\n🚀 后续步骤")
        print("-" * 40)
        print("配置完成后，您可以：")
        print()
        print("1. 启动系统:")
        print("   python3 start.py")
        print()
        print("2. 查看API接口:")
        print("   http://localhost:8080/api/v1/real-apps/status")
        print()
        print("3. 监控系统状态:")
        print("   python3 test_real_apps.py")
        print()
        print("4. 查看详细文档:")
        print("   - SECURITY_SETUP_GUIDE.md")
        print("   - REAL_APPS_INTEGRATION.md")
        print("   - TENCENT_CLOUD_API_REQUIREMENTS.md")
        
    def run(self):
        """运行配置助手"""
        self.print_banner()
        
        # 检查前置条件
        if not self.check_prerequisites():
            return False
            
        # 显示创建子账号指导
        self.create_subaccount_guide()
        
        input("\n按回车键继续...")
        
        # 获取用户凭据
        credentials = self.get_credentials()
        
        # 创建环境配置文件
        self.create_env_file(credentials)
        
        # 测试API连接
        if not self.test_api_connection(credentials):
            print("\n❌ 配置失败，请检查访问密钥和权限设置")
            return False
            
        # 运行系统测试
        if not self.run_system_tests():
            print("\n⚠️  系统测试未完全通过，但基本配置已完成")
            
        # 显示安全建议
        self.show_security_recommendations()
        
        # 显示后续步骤
        self.show_next_steps()
        
        print("\n🎉 安全配置完成！")
        return True

def main():
    """主函数"""
    helper = SecuritySetupHelper()
    success = helper.run()
    sys.exit(0 if success else 1)

if __name__ == "__main__":
    main()
